package ee;

import org.testng.annotations.Test;

import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.util.ArrayList;
import java.util.List;

/**
 * 流---传输数据---传输数据过程中绝对不能出错【处理手段】
 * 标准流结合异常----标准IO
 *
 * 异常
 * Java面向对象语言，程序中所出现的所有错误，定义为对象【处理对应错误】
 *
 * Throwable顶级异常超类
 *
 * Exception异常：描述程序级别的错误---有解决方案
 *               编译期：--RunTimeException异常表示类--
 *                      FileOutputStream创建对象--波浪线---抛出方法之外
 *               检查异常：通常是编译器来检查处理，程序直接报错，抛出
 *               解决方案：①捕获异常（*）
 *                       ②抛出异常---抛出方法之外--打印控制台
 *
 *               运行期：控制台直接显示异常对象【异常对象名字，解决方案】
 *               非检查异常：控制台输出异常对象名称 RunTimeException异常表示类
 *               最后了解【throw与throws---RunTimeException】
 *
 * Error错误：描述程序级别的错误---出现--程序宕机
 *           非常低--->递归问题--->
 *
 *
 */
public class EE {
    /*
     * Error     错误----程序严重错误
     * 模拟：方法调方法---栈溢出错误
     * StackOverflowError栈溢出错误
     * ---程序宕机---后台：9亿账号
     * while(true){
     *      拼接字符串对象
     * }
     */
    public static void method(){
        method();
    }
    @Test
    public void testError(){
        EE.method();
    }

    /**
     * Exception异常：检查异常【出现编译期】---代码报波浪线
     *              两种处理手段：①捕获异常
     *                       语法：try{
     *                           怀疑代码可能有异常或者提示异常
     *                       }catch(小异常名字 e){
     *                        e.printStacktrace();打印异常信息
     *                       }catch(中异常名字 e){
     *                        e.printStacktrace();打印异常信息
     *                       }catch(大异常名字 e){  Exception
     *                       e.printStacktrace();打印异常信息
     *                       }finally{
     *                           一定执行代码块
     *                       }
     *                       快捷键：ctrl+alt+T
     *
     *                         ②抛出异常  throws  异常名字
     *               考试题：throw与throws的区别
     *               异常关键字：throw
     *                        throws
     *
     *              非检查异常【出现运行期】---代码无错误---控制台
     * --------------------------------
     * 异常： FileNotFoundException    文件不存在异常
     * 产生原因：路径写错，文件名写错
     * 异常：NullPointerException    空指针异常
     * 产生原因：获取字符串为空，数组：值为空，集合：元素为空
     * 异常：StringIndexOutOfBoundsException   字符串下标越界异常
     * 产生原因：字符串下标没有对应的字符
     * 异常：NumberFormatException  数字转换异常
     * 长生原因：字符串不是正确的选类型
     */
    @Test
    public void testException() throws FileNotFoundException {
        //检查异常【出现编译期】---代码报波浪线
        // FileOutputStream fis=new FileOutputStream("");
        //非检查异常【出现在控制台】---控制台
        try {
            String str = "a";
            str.length();
            str.charAt(1);
            Integer.parseInt(str);//解析字符串--转换为对应类型
        } catch(StringIndexOutOfBoundsException e){
            e.printStackTrace();//打印异常信息
            System.out.println("字符串小异常：下标越界异常");
        }

        catch (NumberFormatException e) {
            e.printStackTrace();//打印异常信息
            System.out.println("字符串小异常");
        } catch(Exception e){
            e.printStackTrace();
            System.out.println("大异常");
        }
        finally {
            System.out.println("一定执行代码块");

        }
    }
    /**
     * 作业1：写出5个【非检查】异常的代码示例
     * 提示：查API---java.lang.异常
     *      字符串，包装类，集合，io流
     */
    @Test
    public void testHomeWork1(){


//1.ArrayIndexOutOfBoundsException
            int[] arr ={1,2,3};
            int element =arr[3] ;
//2.ClassCastException
            Exception ex = new Exception();
            RuntimeException rex = (RuntimeException)ex;

            System.out.println("程序结束了");

//3.IndexOutOfBoundsException
            List<String> list = new ArrayList<>();
            list.add("one");
            list.add("two");
            list.add("three");

            String value = list.get(3);
//4.ArrayStoreException
        Object[] objectArray = new String[5];
        objectArray[0] = 123;
        //5.ArithmeticException
        int a = 10;
        int b = 0;
        int r = a / b;
        System.out.println(r);

        System.out.println("完毕");
        }
    }

